package com.example.springioc.controller;

import com.example.springioc.config.UserInfo;
import com.example.springioc.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.stereotype.Controller;

import javax.annotation.Resource;

/**
 * ClassName: UserController
 * Package: IntelliJ IDEA
 * Description:
 *
 * @Author 谷京京
 * @Create 2023/11/4 10:10
 * @Version 1.0
 */
@Controller
public class UserController {
    //属性注入
    //当一个类型只有一个bean, 属性注入以类型进行匹配, 与注入属性的名称无关
    //当一个类型存在多个bean时, 优先名称匹配, 如果名称无法匹配, 报错
    //  解决:1. 加@Primary, 标识默认的对象 2. 属性名和bean名保持一致
    //      3. 使用@Qualifier指定使用哪个bean 4. 使用Resource指定bean(此时不需要Autowired)  常用
    //Autowired与Resource的区别
    //1. Autowired是spring提供的, 只能在spring框架中使用; 而resource是jdk提供的.
    //2. Autowired默认是按照类型注入的, 如果同类型的对象有多个, 就需要用名称匹配; 而resource按照名称注入的
    //无法注入一个final修饰的属性, 因为final修饰的属性定义时就进行赋值, 构造方法中进行赋值

    @Autowired
    private UserService userService;

    @Qualifier("userInfo2")
    @Autowired
    public UserInfo user2;
    @Resource(name = "userInfo2")
    public UserInfo user;

    //构造方法注入
    //可以注入一个final修饰的属性
    //对象不可以被修改
    //如果存在多个构造方法时, 需要指定使用哪个
    //如果有无参构造函数, 就默认用无参构造函数
    //如果有多个有参的构造函数, 没有无参构造函数时, 需指定使用哪个(加@AutoWired), 只能加一个
//    private UserService userService;
//    private UserInfo userInfo;
//
//    public UserController(UserService userService) {
//        this.userService = userService;
//    }
//
//    @Autowired
//    public UserController(UserService userService, UserInfo userInfo) {
//        this.userService = userService;
//        this.userInfo = userInfo;
//    }

    //Setter方法注入, 在set方法上面加@Autowired
    //不能注入一个final修饰的属性
    //对象可以被修改
//    private UserService userService;
//
//    @Autowired
//    public void setUserService(UserService userService) {
//        this.userService = userService;
//    }

    public void doController() {
        userService.doService();
//        System.out.println(user);
//        System.out.println("do Controller");
    }

}
